<?php

/*
 * Хелпер HTML
 */

namespace T4\HTML;
use T4\MODEL\ElementFactory;

class Helper {
	
	/**
	 * Форма, построенная по модели
	 * для редактирования или добавления нового объекта в БД
	 * @param \T4\Model $model Модель
	 * @param type $mode Режим работы формы edit|save
	 * @param type $action action формы
	 * @param type $method метод отправки данных
	 * @return string HTML код формы
	 */
	public static function form(\T4\Model $model, $mode='edit', $action='', $method='post') {
		
		$view = new \T4\View(array(__DIR__));
		
		$view->assign('mode',	$mode);
		$view->assign('action',	empty($action) ? $_SERVER['REQUEST_URI'] : $action);
		$view->assign('method',	$method);
		
		$className = get_class($model);
		$view->assign('ID', $className::PRIMARY_KEY);
		
		$view->assign('object',	$model);
		
		$schema = $className::getSchema();
		$hasFiles = false;
		foreach ($schema['columns'] as $name => $definition) {
			if ($definition['type'] == 'file' || $definition['type'] == 'image')
				$hasFiles = true;
		}
		$view->assign('hasFiles', $hasFiles);
		
		$view->assign('columns', $schema['columns']);
		$view->assign('relations', $schema['relations']);
		
		$view->assign('helper', new self);
		
		return $view->render('form.html');
		
	}
	
	
	/**
	 * Таблица, построенная на основе коллекции моделей
	 * Применяется как список объектов в админ-панели
	 * @param \T4\MODEL\Collection $collection Коллекция объектов-моделей
	 * @return string HTML-код таблицы
	 */
	public static function table(\T4\MODEL\Collection $collection, $hrefBase='', $title='', $options=array()) {
		
		$view = new \T4\View(array(__DIR__));
		
		// Опции отображения таблицы
		$opt = array();
		$opt['modelTitleColumn']	= isset($options['modelTitleColumn']) ? $options['modelTitleColumn'] : 'title';
		$opt['hasOrder']			= isset($options['hasOrder']) && $options['hasOrder'] ? true : false;
		$opt['modelOrderColumn']	= isset($options['modelOrderColumn']) ? $options['modelOrderColumn'] : 'order';
		$view->assign('options', $opt);
		
		if ( count($collection) > 0 ) {
			$class = get_class($collection[0]);
			$schema = $class::getSchema();
			$columns = $schema['columns'];
			$view->assign('columns', $columns);
		}
		
		$view->assign('objects',	$collection);
		$view->assign('base',		$hrefBase);
		$view->assign('title',		$title);
		
		return $view->render('table.html');

	}
	
	/**
	 * Построитель select для связи с другой моделью
	 * @param string $name
	 * @param array $definition
	 * @return string 
	 */
	public function select($name, $definition, $selected='') {
		
		$class = $definition['model'];
		$titleColumn = isset($definition['title']) ? $definition['title'] : 'title';
		$nullValue = isset($definition['empty']) && $definition['empty'] == true ? true : false;
		
		$objects = $class::findAll();
		
		$html = '<select name="">';
		
		if ($nullValue)
			$html .= '<option value="0">---</option>';
		
		foreach ($objects as $obj) {
			$html .= '<option value="' . $obj->{$class::PRIMARY_KEY} . '"' . ( $obj->{$class::PRIMARY_KEY}->getData() == $selected ? 'selected="selected"' : '' ) . '>' . $obj->{$titleColumn} . '</option>';
		}
		
		$html .= '</select>';
		
		return $html;
		
	}
	
}